﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class PersonCopy
{
public:
	PersonCopy()
	{
		cout << "默认构造函数调用！" << endl;
	}
	PersonCopy(int a)
	{
		cout << "有参构造函数调用！" << endl;
	}
	PersonCopy(const PersonCopy& p)
	{
		m_Age = p.m_Age;
		cout << "拷贝构造函数调用！" << endl;
	}
	~PersonCopy()
	{
		cout << "析构函数调用！" << endl;
	}

	int m_Age;
};
//3.以值传递的方式给函数参数传递；PersonCopy p = PersonCopy(p1);使用引用的话，不会调用拷贝构造，节省开销；
//void doWorkCopy(PersonCopy p)
void doWorkCopy(PersonCopy& p)
{

}
//4.以值方式返回局部对象；
PersonCopy doWorkReturn()
{
	PersonCopy p3;//默认构造函数调用！
	//return p3;	  //拷贝构造函数调用！
	return NULL;//有参构造函数调用！
}
//5.Release下会进行优化：不调用默认构造；
/*
* PersonCopy p;
* doWorkReturn(p);
* void doWorkReturn(PersonCopy &p)
*{
*		//6.调用默认构造；
*		PersonCopy p1;
*}
*/

void testCopyConstructor()
{
	//2.拷贝构造函数调用的时机：
	//1.用已经创建好的对象，来初始化新的对象；
	PersonCopy p1;//默认构造函数调用！
	p1.m_Age = 10;

	PersonCopy p2(p1);//拷贝构造函数调用！

	doWorkCopy(p1);//默认构造函数调用！

	PersonCopy p4 = doWorkReturn();//默认构造函数调用！
								   //拷贝构造函数调用！ --> 有参构造函数调用！

	/*析构函数调用！
	析构函数调用！
	析构函数调用！
	析构函数调用！*/
}

//main259：拷贝构造函数的调用时机
int main259()
{
	testCopyConstructor();

	system("pause");
	return EXIT_SUCCESS;
}